

#pragma once

#include "json_prase_recv.h"
#include "logging.h"
#include "can_client.h"
#include "safeuqeue.h"
#include "common_util.h"

extern std::shared_ptr<SafeQueue::SafeQueue<canbus::CanFrame>> sCanSendQueue;

/*
{
"VIN":"LMY1C22C00001",
"terminalID":0,
"frameID":10,
"sysDataType":1001,
"timestamp":1532345667,
"code":"01",
"data":{
    "ctrlType":10,
    "taskNo":"12345678",
    "authCode":"LMY1C22C00001",
    "ctrlStatus":"01"  //00: 无效 01：唤醒 02：点火 03：下电 04：急停
    }
}
*/
/*
{
    "VIN":"LSD1A23A10004",
    "terminalID":"02",
    "frameID":1,
    "sysDataType":1004,
    "timestamp":1701481459,
    "code":"10",
    "data":{
        "taskNo":"1730764921312624640",
        "ctrlStatus":"12"
    }
}
*/
/*
{
    "VIN":"LSD1A23A10004",
    "terminalID":"02",
    "sysDataType":1001,
    "frameId":1,
    "timeStamp":1701481507979,
    "code":"01",
    "data":{
        "authCode":"LSD1A23A10004",
        "ctrlStatus":"02",     //00: 无效  01：唤醒 02：点火 03：下电 04：急停
        "ctrlType":10,        // 10: 无效  11：车辆休眠 12：车辆唤醒
        "taskNo":"1730764921006440448"
    }
}

// 相应暂无


*/
/*
{
"VIN":"LMY1C22C00001",
"terminalID":0,
"frameID":10,
"sysDataType":1004,
"timestamp":1532345667,
"code":"01",
"data":{
        "ctrlType ":10,
        "taskNo ":”12345678”,
        "authCode ":” LMY1C22C00001”,
        "ctrlStatus ":”01” //00: 无效 01：车辆休眠 02：车辆唤醒  ， 只需要处理 ctrlStatus
    }
}
*/

// std::string jsonToString = R"(
// {"VIN":"LSD1A23A10004","terminalID":"02","sysDataType":1001,"frameId":1,"timeStamp":1701481507979,"code":"01","data":{"authCode":"LSD1A23A10004","ctrlStatus":"02","ctrlType":10,"taskNo":"1730764921006440448"}}
// )";

namespace tbox_msg
{
    int jsonPraseRecv::parse_json(std::string content)
    {
        int sysDataType_num = 0;
        int ctrlStatus_num = 0;

        std::string json_content = content;
        rapidjson::Document document;
        if (document.Parse(json_content.c_str()).HasParseError())
        {
            printf("err here %s,%d\r\n", __FILE__, __LINE__);
            return -1;
        }
        else
        {
            if (!(document.HasMember("sysDataType")))
                printf("err here:%s,%d\r\n", __FILE__, __LINE__);
            else
            {
                if (document["sysDataType"].IsInt())
                    sysDataType_num = document["sysDataType"].GetInt();
            }
            if (!(document.HasMember("data")))
                printf("err here:%s,%d\r\n", __FILE__, __LINE__);
            else
            {
                rapidjson::Value data;
                data = document["data"]; // 使用一个新的rapidjson::Value来存放object
                if (data.HasMember("ctrlStatus"))
                {
                    if (data["ctrlStatus"].IsString())
                    {
                        std::string c_status = data["ctrlStatus"].GetString();
                        ctrlStatus_num = stoi(c_status);
                    }
                }
            }

            // 取出对应的数据
            // json ID 1004
            // 0保持，1唤醒，2休眠 , 其余位都是零
            // can msg wake up  0x01
            // can_id 0x1000

            // json ID 1001
            // 0~1保持，1无效，2点火 ,3 下电 其余位都是零
            // 2, 0:无效，1:急停
            // 3, 0离线，1在线
            // 4, 0离线，1在线
            // can msg wake up  0x01
            // can_id 0x18FF0723
            switch (sysDataType_num)
            {
            case 1001:
                LOG_INFO(" 1001 recv msg {}", ctrlStatus_num);
                break;
            case 1004:
                LOG_INFO(" 1004 recv msg {}", ctrlStatus_num);
                break;
            default:
                break;
            }
        }
        return 0;
    }

    int jsonPraseRecv::parse_json(const char *jbuf)
    {
        int sysDataType_num = 0;
        int ctrlStatus_num = 0;
        uint8_t ctrlStatus_hex = 0;
        canbus::CanFrame can_frame;
        rapidjson::Document document;
        if (document.Parse(jbuf).HasParseError())
        {
            printf("err here %s,%d\r\n", __FILE__, __LINE__);
            return -1;
        }
        else
        {
            if (!(document.HasMember("sysDataType")))
                printf("err here:%s,%d\r\n", __FILE__, __LINE__);
            else
            {
                if (document["sysDataType"].IsInt())
                    sysDataType_num = document["sysDataType"].GetInt();
            }
            //   发出sysDataType，返回相同的sysDataType，表示收到数据
            if (!(document.HasMember("data")))
                printf("err here:%s,%d\r\n", __FILE__, __LINE__);
            else
            {
                rapidjson::Value data;
                data = document["data"]; // 使用一个新的rapidjson::Value来存放object
                if (data.HasMember("ctrlStatus"))
                {
                    if (data["ctrlStatus"].IsString())
                    {
                        std::string c_status = data["ctrlStatus"].GetString();
                        ctrlStatus_num = stoi(c_status);
                    }
                }
            }
            // 取出对应的数据
            // json ID 1004
            // 0保持，1唤醒，2休眠 , 其余位都是零
            // can msg wake up  0x01
            // can_id 0x1000

            // json ID 1001
            // 0~1保持，1无效，2点火 ,3 下电 其余位都是零
            // 2, 0:无效，1:急停
            // 3, 0离线，1在线
            // 4, 0离线，1在线
            // can msg wake up  0x01
            // can_id 0x18FF0723
            switch (sysDataType_num)
            {
            case 1001:
                can_frame.id = 0x18FF0723;
                can_frame.data[0] = ctrlStatus_num;
                memset(&can_frame.data[1], 0, 7);
                break;
            case 1004:
                can_frame.id = 0x1000;
                if (ctrlStatus_num == 0x01)
                {
                    ctrlStatus_hex = 0x02;
                }
                else if (ctrlStatus_num == 0x02)
                {
                    ctrlStatus_hex = 0x01;
                }
                else
                {
                    ctrlStatus_hex = 0;
                }
                can_frame.data[0] = ctrlStatus_hex;
                memset(&can_frame.data[1], 0, 7);
                break;
            default:
                sysDataType_num = 0;
                break;
            }
            LOG_INFO(" sysDataType {} ,ctrlStatus {} ", sysDataType_num, ctrlStatus_num);
            // 其他 sysDataType_num 不处理，最好在定时器中处理
            if (sysDataType_num)
            {
                for (int i = 0; i < 100; i++) // 收到一次平台点火命令，对vcu下发50次指定贞
                {
                    sCanSendQueue->push(can_frame);
                }
            }
        }
        return 0;
    }

    // 输出
    void jsonPraseRecv::displayJson(rapidjson::Document &doc)
    {
        rapidjson::StringBuffer jsonBuffer;
        rapidjson::Writer<rapidjson::StringBuffer> writer(jsonBuffer);
        doc.Accept(writer);
        printf("%s\n\n", jsonBuffer.GetString());
    }

    // 初始化
    rapidjson::Document jsonPraseRecv::string2Json(std::string str)
    {
        rapidjson::Document root;
        if (root.Parse(str.c_str()).HasParseError())
        {
            return NULL;
        }
        return root;
    }

}
// int main()
// {
//     // main_1();

//     parse_json(jsonToString);

//     return 0;
// }
